package com.minsheng.epidemic_rep.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * @Classname ZipUtil
 * @Description TODO
 * @Date 2020/9/27 11:11
 * @Created by You
 */
public class ZipUtil {

    private static final Logger logger = LoggerFactory.getLogger(GenerateCsv.class);

    /**
     * @param fileRealPathList 待压缩的文件列表
     * @param zipFileRealPath  压缩后的文件名称
     * @return boolean
     * @throws :Exception
     * @Function: zipFiles
     * @Description:多个文件的ZIP压缩
     */
    public static void zipFiles(List<String> fileRealPathList, String zipFileRealPath)
            throws IOException
    {
        FileOutputStream out = null;
        ZipOutputStream zipOut = null;
        try
        {
            // 根据文件路径构造一个文件实例
            File zipFile = new File(zipFileRealPath);
            // 判断目前文件是否存在,如果不存在,则新建一个
            if (!zipFile.exists())
            {
                zipFile.createNewFile();
            }
            // 根据文件路径构造一个文件输出流
            out = new FileOutputStream(zipFileRealPath);
            // 传入文件输出流对象,创建ZIP数据输出流对象
            zipOut = new ZipOutputStream(out);
            // 循环待压缩的文件列表
            for (String fileRealPath : fileRealPathList)
            {
                FileInputStream in = null;
                try
                {
                    File file = new File(fileRealPath);
                    if (!file.exists())
                    {
                        logger.error("文件不存在");
                        throw new FileNotFoundException("文件不存在");
                    }

                    // 创建文件输入流对象
                    in = new FileInputStream(fileRealPath);
                    // 得到当前文件的文件名称
                    //判断操作系统
                    String separateCharacter = "";
                    String os = System.getProperty("os.name");
                    if (os.toLowerCase().startsWith("win"))
                    {
                        //windows操作系统
                        separateCharacter = "\\";
                    }
                    else
                    {
                        //非windows操作系统
                        separateCharacter = "/";
                    }
                    String fileName = fileRealPath.substring(
                            fileRealPath.lastIndexOf(separateCharacter) + 1, fileRealPath.length());
                    // 创建指向压缩原始文件的入口
                    ZipEntry entry = new ZipEntry(fileName);
                    zipOut.putNextEntry(entry);
                    // 向压缩文件中输出数据
                    int nNumber = 0;
                    byte[] buffer = new byte[512];
                    while ((nNumber = in.read(buffer)) != -1)
                    {
                        zipOut.write(buffer, 0, nNumber);
                    }
                }
                catch (IOException e)
                {
                    logger.error("文件压缩异常-in，原因：", e);
                    throw new IOException("文件压缩异常");
                }
                finally
                {
                    // 关闭创建的流对象
                    if (null != in)
                    {
                        in.close();
                    }
                }
            }
        }
        catch (IOException e)
        {
            logger.error("文件压缩异常-out，原因：", e);
            throw new IOException("文件压缩异常");
        }
        finally
        {
            if (null != zipOut)
            {
                zipOut.close();
            }
            if (null != out)
            {
                out.close();
            }
        }
    }

    /*
     * 函数名：getFile
     * 作用：使用递归，输出指定文件夹内的所有文件
     * 参数：path：文件夹路径   deep：表示文件的层次深度，控制前置空格的个数
     * 前置空格缩进，显示文件层次结构
     */
    public static List<String> getFile(String path, int deep) {

        List<String> list = new ArrayList<String>();

        // 获得指定文件对象
        File file = new File(path);
        // 获得该文件夹内的所有文件
        File[] array = file.listFiles();

        for (int i = 0; i < array.length; i++) {
            if (array[i].isFile())//如果是文件
            {
                // 只输出文件名字
                System.out.println(array[i].getName());
                // 输出当前文件的完整路径
                // System.out.println("#####" + array[i]);
                // 同样输出当前文件的完整路径   大家可以去掉注释 测试一下
                // System.out.println(array[i].getPath());
                list.add(array[i].getPath());
            } else if (array[i].isDirectory())//如果是文件夹
            {
                System.out.println("文件夹过滤掉。。。");
            }
        }
        return list;

    }

}
